package org.platform.tool.util;


import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 数据帧 解析 / 组装工具
 * <p>
 * 内部数据帧格式
 * 名称        符号	        长度   	描述
 * 帧头        FrameHead	    4	    固定字段，1234567890
 * 信源        Source	    1	    见表 12
 * 信宿        Destination	1	    见表 12
 * 信息类别	  FrameType	    4	    表示信息类型
 * .                                0x00：软件运行状态；
 * .                                0x01：任务执行步骤DMC；
 * .                                0x02：任务执行步骤TASK；
 * .                                0x03：参数告警；
 * .                                0x04：设备状态；
 * .                                0x05：测试步骤
 * 时间	       Time	        4    	本日积秒，单位：0.1ms。
 * 数据域长度   DataLen	    4    	以字节为单位表示数据域的实际长度
 * 数据域	  DataField   	N    	自定义
 * 帧尾	      FrameEnd   	4    	固定字段，-1234567890
 *
 * @author FengJie
 * @date 2018/8/30
 */
public class DataFrameUtil {
    /**
     * 枕头帧尾固定长度
     */
    private static final Integer LENGTH = 22;
    /**
     * 故障诊断模块代码
     */
    private static final int FDS = 0x64;
    /**
     * 任务模块代码
     */
    private static final int TASK = 0x61;
    /**
     * 帧头
     */
    private static final Integer HEAD = 1234567890;
    /**
     * 帧尾
     */
    private static final Integer TAIL = -1234567890;


    /**
     * 生成内部数据帧
     *
     * @param dataField 需要发送的数据
     * @return 数据帧
     */
    public static byte[] generate(String dataField) {
        byte[] bytes = dataField.getBytes();
        byte[] data = new byte[bytes.length + LENGTH];
        //变量依次是(原数组，从原数组第几位开始，目标数组，从第几位开始粘贴，复制长度)
        System.arraycopy(int2Byte(HEAD), 0, data, 0, 4);
        data[4] = (byte) FDS;
        data[5] = (byte) TASK;
        System.arraycopy(int2Byte(0x03), 0, data, 5, 4);
        long now = System.currentTimeMillis();
        SimpleDateFormat sdfOne = new SimpleDateFormat("yyyy-MM-dd");
        try {
            long overTime = (now - (sdfOne.parse(sdfOne.format(now)).getTime())) / 1000;
            System.arraycopy(int2Byte(ComUtils.longToInteger(overTime)), 0, data, 9, 4);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        System.arraycopy(int2Byte(bytes.length), 0, data, 13, 4);
        System.arraycopy(bytes, 0, data, 17, bytes.length);
        System.arraycopy(int2Byte(TAIL), 0, data, 21, 4);

        return data;
    }

    /**
     * 解析内部数据帧
     *
     * @param bytes 接收的数据帧
     * @return 解码出来的数据
     */
    public static String analysis(byte[] bytes) {
        byte[] data = new byte[bytes.length - 22];
        System.arraycopy(int2Byte(TAIL), 0, data, 17, data.length);
        return new String(data);
    }


    /**
     * int 转 数组
     *
     * @param i int 数字
     * @return byte[]
     */
    private static byte[] int2Byte(int i) {
        return new byte[]{
                (byte) ((i >> 24) & 0xFF),
                (byte) ((i >> 16) & 0xFF),
                (byte) ((i >> 8) & 0xFF),
                (byte) (i & 0xFF)
        };
    }
}
